package com.lisn.sghook_lancet;

import android.content.ClipData;
import android.util.Log;

import me.ele.lancet.base.Origin;
import me.ele.lancet.base.annotations.Insert;
import me.ele.lancet.base.annotations.Proxy;
import me.ele.lancet.base.annotations.TargetClass;

public class ToolsLancet {

    /**
     * 程序中不需要显示地去调用 LancetHooker 类，Lancet 内部是通过 Gradle Transform 来修改目标类的字节码，
     * **Transform 是指在项目在编译成 .class 之后在生成 .dex 之前通过 ASM 去修改 .class 文件的。
     * **下面这些类都是在打包编译时生成的，因此上面引入 lancet 库时只需要使用 privoded ，provided 表示在编译时依赖，不需要在运行时依赖。
     *
     */
    // hook 编译后代码路径：
    // SGHook_lancet\app\build\intermediates\transforms\lancet\debug\40\com\lisn\sghook_lancet\Tools.class

    /**
     * @TargetClass 指定了将要被织入代码目标类 android.util.Log.
     * @Proxy 指定了将要被织入代码目标方法 e.
     * Origin.call() 代表了 Log.e() 这个目标方法.
     */
    @Proxy("e")
    @TargetClass("android.util.Log")
    public static int anyName(String tag, String msg) {
        msg = msg + " lancet";
        // Origin.call():用来调用有返回值的方法
        return (int) Origin.call();
    }

    /**
     * TargetClass 注解：标识你要修改的类名；
     * Insert注解：表示你要往 evilCode 这个方法里面注入下面的代码
     * 下面的方法声明需要和原方法保持一致，如果有参数，参数也要保持一致（方法名、参数名不需要一致）
     */
    @TargetClass("com.lisn.sghook_lancet.Tools")
    @Insert("evilCode")
    public static void evilCode() {
        Log.e("TAG", "evilCode: 修改后代码");
        try {
            // 调用原来的处理逻辑
            // 用来调用没有返回值的方法.
            Origin.callVoid();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    // 模拟用户同意后的状态
    public static boolean isAuth = true;

    /**
     * @return
     * @Proxy：意思就是代理，会代理ClipboardManager. getPrimaryClip到我们这个方法中来
     */
    @TargetClass("android.content.ClipboardManager")
    @Proxy("getPrimaryClip")
    public ClipData getPrimaryClip() {
        if (isAuth) {
            return (ClipData) Origin.call();
        }
        // 这里也可以 return null,毕竟系统也 return null
        return new ClipData("未授权呢", new String[]{"text/plain"}, new ClipData.Item(""));
    }
}
